package com.chiyou.common.utils;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;


/**
 * redis工具类的基类
 * @author 陈嘉瑛
 * @version 2015-11-18
 */
public class RedisBase {
	private static Log logger =  LogFactory.getLog(RedisBase.class);
	private static final int JEDIS_INDEX = 0;

	/**
	 * 把jedis对象放入缓存池中
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param redis
	 */
	@SuppressWarnings("deprecation")
	public Boolean returnPool(Jedis redis) {
		JedisPool jedisPool = JdiresPool.getJdisPool();
		if(jedisPool == null) return false;
		if (redis != null) {
			jedisPool.returnResource(redis);
			//redis = null;
			return true;
		}
		return false;
	}

	/**
	 * 获取jedis对象
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @return
	 */
	public Jedis getJedis() {
		try {
			JedisPool jedisPool = JdiresPool.getJdisPool();
			if(jedisPool == null) {
				Jedis jedis = new Jedis(RedisConfigUtil.REDIS_IP, RedisConfigUtil.REDIS_PORT,0);
				//如果有设置密码要输入密码校验
				if(RedisConfigUtil.REDIS_PWD != null && !RedisConfigUtil.REDIS_PWD.trim().equals(""))
					jedis.auth(RedisConfigUtil.REDIS_PWD);
				return jedis;
			}
			Jedis jedis = jedisPool.getResource();
			jedis.select(JEDIS_INDEX);
			return jedis;
		} catch (Exception e) {
			logger.debug("========获取jedis对象异常========"+e.getMessage());
		} finally{
			logger.debug("=======获取jedis对象=========");
		}
		return null;
	}

	/**
	 * 设置对应key的失效时间（秒）
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @param inactiveTime
	 */
	public Boolean expire(Object key, Integer inactiveTime){
		return expire(SerializeUtil.serialize(key), inactiveTime);
	}
	
	/**
	 * 设置对应key的失效时间（秒）
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @param inactiveTime
	 */
	public Boolean expire(byte[] key, Integer inactiveTime){
		Jedis jedis = this.getJedis();
		try{
			if(inactiveTime != null){
				Long num = jedis.expire(key, Integer.valueOf(inactiveTime));
				if(num != null && num > 0) return true;
				return false;
			}
		}finally{
			this.returnPool(jedis);
		}
		return false;
	}
	
	/**
	 * 查看key剩余失效时间（秒）
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @return
	 */
	public Long ttl(Object key){
		return ttl(SerializeUtil.serialize(key));
	}
	
	/**
	 * 查看key剩余剩余失效时间（秒）
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @return
	 */
	public Long ttl(byte[] key){
		Jedis jedis = this.getJedis();
		Long num = jedis.ttl(key);
		this.returnPool(jedis);
		return num;
	}
	
	/**
	 * 判断是否存在该key
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @return
	 */
	public Boolean exists(Object key){
		Jedis jedis = this.getJedis();
		Boolean flag = jedis.exists(SerializeUtil.serialize(key));
		this.returnPool(jedis);
		return flag;
	}
	
	/**
	 * 判断是否存在该key
	 * key需要序列化
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @return
	 */
	public Boolean exists(byte[] key){
		Jedis jedis = this.getJedis();
		Boolean flag = jedis.exists(key);
		this.returnPool(jedis);
		return flag;
	}
	
	/**
	 * 重命名key
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key 旧key
	 * @param newKey 新key
	 * @return 
	 */
	public Boolean renameKey(Object key, Object newKey){
		return renameKey(SerializeUtil.serialize(key), SerializeUtil.serialize(newKey));
	}

	/**
	 * 重命名key
	 * key需要序列化
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key 旧key
	 * @param newKey 新key
	 * @return
	 */
	public Boolean renameKey(byte[] key, byte[] newKey) {
		Jedis jedis = this.getJedis();
		String rs = jedis.rename(key, newKey);
		this.returnPool(jedis);
		if("ok".equalsIgnoreCase(rs)){
			return true;
		}
		return false;
	}
	
	/**
	 * 删除指定的key
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @return
	 */
	public Boolean del(Object key){
		return del(SerializeUtil.serialize(key));
	}

	/**
	 * 删除指定的key
	 * key需要序列化
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @return
	 */
	public Boolean del(byte[] key) {
		Jedis jedis = this.getJedis();
		try{
			Long num = jedis.del(key);
			if(num != null && num > 0) return true;
		}catch(Exception e){
			logger.debug(e.getMessage());
		}finally{
			this.returnPool(jedis);
		}
		return false;
	}
}
